package climb;

import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import util.ExcelUtil;

import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @author <a href="mailto:hellohesir@gmail.com">Mr_He</a>git s
 * 2019/9/6 15:16
 */
public class NickNameInExcel extends WebCrawler {

    private static Pattern pattern = Pattern.compile("[^\\u4e00-\\u9fa5a-zA-Z0-9]"); //去掉空格符合换行符

    private static List<List<String>> dataList = new ArrayList<>();

    private static boolean flag = false;

    /**
     * 正则表达式匹配指定的后缀文件
     */
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" + "|png|mp3|mp4|zip|gz))$");

    public NickNameInExcel() throws FileNotFoundException, UnsupportedEncodingException {
    }

    /**
     * 这个方法主要是决定哪些url我们需要抓取，返回true表示是我们需要的，返回false表示不是我们需要的Url
     * 第一个参数referringPage封装了当前爬取的页面信息 第二个参数url封装了当前爬取的页面url信息
     * 在这个例子中，我们指定爬虫忽略具有css，js，git，...扩展名的url，只接受以“http://www.ics.uci.edu/”开头的url。
     * 在这种情况下，我们不需要referringPage参数来做出决定。
     */
    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase();// 得到小写的url
        return !FILTERS.matcher(href).matches() // 正则匹配，过滤掉我们不需要的后缀文件
                && href.startsWith("http://www.nibaku.com") && href.contains("wangming");//
    }

    /**
     * 当一个页面被提取并准备好被你的程序处理时，这个函数被调用。
     */
    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();// 获取url
        System.out.println("URL: " + url);

        if (page.getParseData() instanceof HtmlParseData) {
            HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();// 获取html数据对象
            String html = htmlParseData.getHtml();
            Document doc = Jsoup.parse(html, "UTF-8");
            Elements elements = doc.select(".content").select(".center");
            for (Element element : elements) {
                Elements p = element.select("p");
                for (Element e : p) {
                    if (dataList.size() >= 600) {
                        synchronized (this) {
                            if (flag) {
                                System.out.println("===========================创建完成============================");
                                return;
                            }
                            ExcelUtil.createExcel(dataList, new String[]{"昵称", "翻译后昵称"});
                            System.out.println("===========================创建完成============================");
                            flag = true;
                            return;
                        }
                    }
                    List<String> list = new ArrayList<>(1);
                    list.add(pattern.matcher(e.html()).replaceAll(""));
                    dataList.add(list);
                }
            }
        }

    }

}
